#include <iostream>
#include <string>
using namespace std;

#ifndef CCOLOR_H
#define CCOLOR_H

/**
 * @addtogroup Couleurs
 * @{
 */

/**
 * Définit tous les attributs possibles.
 */
enum Attributs
  {
    ATTRIB_NONE          = 0, /**< Aucun */
    ATTRIB_BOLD          = 1, /**<  Gras*/
    ATTRIB_ITALIC        = 2, /**< Italique */
    ATTRIB_UNDERLINE     = 4, /**< Souligné */
    ATTRIB_BLINK         = 8, /**< Clignotant */
    ATTRIB_REVERSE       = 16, /**< Inverse couleur d'avant- et d'arrière-plan*/
    ATTRIB_CONCEALED     = 32, /**< Ecriture "invisible" */
    ATTRIB_STRIKETHROUGH = 64 /**< Barré */
  };

/**
 * Couleurs disponibles.
 */
enum Couleurs
  {
    BLACK         = 0, /**< Noir */
    RED           = 1, /**< Rouge */
    GREEN         = 2, /**< Vert */
    YELLOW        = 3, /**< Jaune */
    BLUE          = 4, /**< Bleu */
    PINK          = 5, /**< Rose*/
    CYAN          = 6, /**< Cyan */
    WHITE         = 7, /**< Blanc*/
    DEFAULT_COLOR = 8 /**<  Couleur par défaut*/
  };

/**
 * Cette classe permet de changer la couleur d'affichage dans le
 * terminal, en utilisant les codes ANSI.
 *
 * Je n'ai pas codé cette classe, je l'ai juste adaptée et orientée
 * C++, avant les codes étaient des char**, j'en ai fait des
 * strings. On peut spécifier la couleur de la police (foreground), la
 * couleur (background) et un attribut. Le résultat de l'affichage est
 * dépendant de la configuration du terminal.
 *
 * @author Soilwork
 * @author Johan "Solo" Luisier
 */
class CColor
{
 private:
  int bgColor, /**< Couleur des caractères */
    fgColor; /**< Couleur d'arrière-plan */

  /**
   * Differents attributs disponibles (italique, gras, ...).
   *
   * Remarque : Quand ces variables valent -1, cela signifie qu'elles
   * ne sont pas prises en compte lors de la generation de la sequence
   * d'echappement Comme ca, on peut generer simplement : "\033[8m"
   * par exemple
   */
  int attributes;

  static string codeFG[9], /**< Codes de couleur pour les caractères */
    codeBG[9]; /**< Codes de couleur pour le fond */
  
 public:
  /**
   * Constructeur par défaut.
   * @param foreground couleur des caractères
   * @param background couleur d'arrière-plan
   * @param att attribut
   */
  CColor(int foreground=-1, int background=-1, int att=-1);
  
  /**
   * Constructeur de copie.
   * @param color couleur à copier
   */
  CColor(const CColor &color);
  
  /**
   * Permet de configurer la couleur d'avant-plan
   * @param color la couleur
   */
  void setFGColor(int color);
  /**
   * Permet de configurer la couleur d'arrière-plan
   * @param color la couleur
   */
  void setBGColor(int color);
  /**
   * Permet de configurer l'attribut du texte
   * @param att  l'attribut
   */
  void setAttributes(int att);
  
  /**
   * Retrouve la couleur d'avant-plan
   * @return la couleur
   */
  int getBGColor() const{return bgColor;}
  /**
   * Retrouve la couleur d'arrière-plan
   * @return la couleur
   */
  int getFGColor() const{return fgColor;}
  /**
   * Retrouve l'attribut du texte
   * @return l'attribut
   */
  int getAttributes() const{return attributes;}
  
  /**
   * Supprime un attibut précis
   * @param att l'attribut à supprimer
   */
  void removeAttribute(int att);
  
  /**
   * Met toutes les valeurs à -1
   */
  void reset();
  /**
   * Remet tous les attribut à leur valeur par défaut
   */
  void resetDefault();
  
  /**
   * Donne le code ANSI correspondants aux couleurs et attributs voulus.
   * @return le code ANSI
   */
  string getColorCode() const;
  
  /**
   * Efface l'écran
   * @return le code ANSI d'effaçage de l'écran
   */
  string clearScreen() const;
};

/**
 * @}
 */

#endif //CCOLOR_H
